package com.bosssoft.boss_exam_core.util.common;

import lombok.extern.slf4j.Slf4j;

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/***
 * @Author lys(cherish)
 * @Phone 17720799636
 * @Date  2019/3/14
 * @Description 对象字段屏蔽工具类
 * @since JDK 1.8
 **/
@Slf4j
public class ReflectUtil {

    /***
     * @Author lys(cherish)
     * @Phone 17720799636
     * @Date  2019/3/14
     * @Description 根据hashMap中的配置进行屏蔽字段
     * @Param [obj, clazz, hashMap] 屏蔽依据的配置map
     * @Return java.lang.Object 返回屏蔽字段后的对象
     * @Exception //无
     * @since JDK 1.8
     **/
    public static Object shileldingFiled(Object obj, Map<String,Object> hashMap) {
        hashMap.forEach((fieldName, value) -> {
            try {
                //获取 clazz 类型中的 propertyName 的属性描述器
                PropertyDescriptor pd = new PropertyDescriptor(fieldName, obj.getClass());
                //从属性描述器中获取 set 方法
                Method setMethod = pd.getWriteMethod();
                try {
                    //执行方法
                    setMethod.invoke(obj, value);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } catch (IntrospectionException e) {
                log.error("错误 【屏蔽字段】");
                e.printStackTrace();
            }
        });
        return obj;
    }

    /***
     * @Author lys(cherish)
     * @Phone 17720799636
     * @Date  2019/3/14
     * @Description 将对象的所有属性都放到hashMap中
     * @Param [map, entity] hashmap为存放数据的容器  entity为数据来源
     * @Return HashMap<String,Object> 数据容器
     * @Exception 非法访问异常
     * @since JDK 1.8
     **/
    public static HashMap<String,Object> putFields(HashMap<String,Object> map, Object entity) throws IllegalAccessException {
        for (Field field : entity.getClass().getDeclaredFields()) {
            field.setAccessible(true);
            map.put(field.getName(),field.get(entity));
        }
        return map;
    }
}
